iT邦幫忙

2026 iThome 鐵人賽

DAY 10
0
佛心分享-IT 人自學之術

《拒絕爆肝加班!30天打通跨系統自動化與資料比對防線》系列 第 10

Day 10:GUI 重試機制與異常處理:應對全委新系統的延遲策略

  • 分享至 

  • xImage
  •  

大哥!午安呀!今天外面太陽好大,小晴一跑完客戶,就立刻用最快的速度騎著機車、提著這盒剛出爐、熱騰騰的現烤起司塔衝來找您了!

大哥,快趁熱咬一口,裡面的半熟起司會爆漿喔!這就跟小晴對您的服務熱忱一樣,隨時都是滿到溢出來的!

昨天看到您在Line上說 Day 9 的 AS400 核對實務在公司的教育訓練大受歡迎,小晴開心地在房間裡轉了好幾圈!我就說嘛,交給小晴您絕對可以放一百個心!我雖然是個剛入行、每天在外面曝曬的年輕女房仲,但只要是為了幫最挺我的大哥拼業績、做口碑,IT 自動化這種硬核邏輯,小晴絕對會發揮 「Top Sales 挖寶」 的拼勁,幫您研究得透透徹徹!

這就跟我們買房子一樣,有時候網路卡頓、系統延遲,就像買方和賣方在出價時的「拉鋸戰」——買方出價了,屋主卻遲遲不回覆,這時我們可不能直接放棄、讓交易崩潰!我們必須設定一個 「重試(Retry)機制」,時間到了再溫柔地去催一次;但如果催了5次、超過了合約的 「超時(Time-out)限制」,為了保護客戶的安全,我們就要果斷拋出異常、尋找備用方案!

今天 Day 10,小晴為大哥準備的正是最核心、最考驗架構師容錯思維的 「全委新系統 GUI 重試機制與異常處理」 實戰教學。同樣的,小晴已經完全隱去了所有敏感的行庫名稱,並融入了新託管系統(中菲新系統)的核心報表代號,保證專業度爆表,讓您的 IT 學員們聽完直接頂禮膜拜!大哥您看:


Day 10:GUI 重試機制與異常處理:應對全委新系統的延遲策略

在自動化(RPA / VBA)導向的資產託管作業中,系統升級往往伴隨著介面架構的重構。在引入 「全委新系統自動化工具」 後,最常面臨的底層挑戰便是 「網頁與虛擬機器(VM)渲染延遲」。當自動化腳本試圖操作新系統來下載關鍵報表——例如會計科目彙總表(ABC123) 或 保管有價證券庫存帳值彙計表(ABC456) 時,若因伺服器負載、網路頻寬抖動或虛擬桌面(VDI)瞬時卡頓,導致目標按鈕或下拉選單未能在預期時間內呈現,盲目點擊將直接導致「找不到元件(Element Not Found)」的 Runtime 崩潰。

本篇將探討如何利用強健的 Retry(重試)邏輯Time-out(超時)機制,為新系統自動化流程建立穩固的容錯防護網。


一、 延遲環境下的三大 GUI 崩潰痛點

1. 「盲點(Blind Click)」效應

初階開發者常使用硬編碼延遲(例如:Sleep 5000)。然而,若新系統下載 ABC123 報表 的查詢響應時間在尖峰時刻延長至 6 秒,腳本在第 5 秒便強行執行模擬點擊,便會點在虛無的網格上,引發流程中斷。

2. 視窗失去焦點(Focus Lost)

在執行多工任務或 VM 背景執行時,目標視窗可能因作業系統排程而失去活動狀態(Foreground),導致鍵盤與滑鼠事件(如模擬點選「開始計算」)發送至背景,造成「點擊失效」但程式卻誤以為執行成功的致命假象。

3. 無限死鎖(Infinite Deadlock)

當系統彈出未預期的阻擋視窗(如:「連線已逾時」或「系統更新提示」),若無超時退場機制,自動化線程將無限期停留在等待按鈕可用的狀態,霸佔系統資源,導致後續排程全面塞車。


二、 動態防錯的核心:Retry & Time-out 架構設計

為了克服上述痛點,我們必須將所有關鍵的 GUI 互動步驟包裝在一個 「主動輪詢與自我修復迴圈(Polling & Self-Healing Loop)」 中,其設計邏輯如下圖:

                    ┌────────────────────────┐
                    │  發動 GUI 操作 (如點擊)  │
                    └───────────┬────────────┘
                                │
                      [偵測目標元件是否存在?]
                                │
                 ┌──────────────┴──────────────┐
              (未出現)                      (已出現)
                 │                             │
        [重試次數 < 最大限制?]                 [執行操作]
                 │                             │
          ┌──────┴──────┐                      │
        (Yes)          (No: Timeout)           │
          │             │                      │
     [等待500ms]   [拋出異常/異常截圖]          ▼
    [重新激活視窗]  [優雅終止流程/告警]      [進入下一步驟]

三、 技術核心:動態狀態檢查與多層次容錯處理

在操作「全委新系統自動化工具」 時,標準的強健點擊(Robust Click)應包含以下三道防線:

1. Element Existence & Visibility 雙重驗證

按鈕在 DOM 樹或 UI 樹中「存在(Exist)」,並不等於「可點擊(Clickable / Visible)」。

  • 動態探測:透過框架 API 持續探測控制項的 IsOffscreen(是否在螢幕外)與 IsEnabled(是否啟用)屬性。
  • 動態等待(Explicit Wait):摒棄靜態 Sleep,改用動態輪詢,一旦元件狀態 Ready 立即發動點擊,最大程度縮短等待時間。

2. 視窗重新激活(Re-Focusing)修復機制

當偵測到點擊無響應時,自動化不應立刻宣告失敗,而是應調用 Windows API 的 SetActiveWindowSetForegroundWindow,將新系統的主畫面重新帶至最前景,排除因視窗遮擋造成的事件漏發。

3. Post-Action 驗證(後驗機制)

點擊「查詢」或「開始計算」 後,必須以 「新狀態的出現」 作為上一步成功的指標。例如:

  • 點擊下載 ABC456 後,必須輪詢本機 D 槽是否在 15 秒內產生了 D:\彙計表.txt
  • 只有確認檔案寫入完成,才判定點擊成功;否則,重試點擊按鈕。

四、 關鍵技術實作:VBA 高容錯點擊函數

以下提供一個可在 Excel VBA 自動化工具中直接套用的高容錯按鈕點擊函數思路。該函數封裝了 重試限制動態輪詢視窗強制聚焦 功能:

' 宣告 Windows API
#If VBA7 Then
    Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As LongPtr) As Long
#Else
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long
#End If

''' <summary>
''' 執行高容錯的 GUI 點擊操作
''' </summary>
''' <param name="hwndTarget">目標新系統的視窗控制碼</param>
''' <param name="elementID">目標按鈕的識別碼</param>
''' <param name="maxRetries">最大重試次數</param>
''' <returns>是否成功執行點擊並產生預期結果</returns>
Public Function RobustClickElement(ByVal hwndTarget As LongPtr, ByVal elementID As String, ByVal maxRetries As Integer) As Boolean
    Dim retryCount As Integer
    Dim clickSuccess As Boolean
    
    retryCount = 0
    clickSuccess = False
    
    Do While retryCount < maxRetries And Not clickSuccess
        ' 1. 強制將目標系統視窗帶到最前端,防止焦點遺失
        Call SetForegroundWindow(hwndTarget)
        Sleep 200 ' 短暫等待視窗反應
        
        ' 2. 檢查目標按鈕是否已 Visible 且 Enabled
        If IsElementReadyToClick(hwndTarget, elementID) Then
            ' 3. 執行點擊
            Call SimulateMouseClick(hwndTarget, elementID)
            
            ' 4. Post-Action 驗證:確認是否成功觸發後續動作 (例如產生了 D:\彙計表.txt)
            ' 這裡設定動態等待 1.5 秒
            Sleep 1500
            If VerifyPostActionSuccess(elementID) Then
                clickSuccess = True
            Else
                ' 點擊了但沒有成功響應,可能被微幅卡頓吞掉,記錄 Log 並準備重試
                Debug.Print "Warning: Element " & elementID & " clicked but verification failed. Retrying... (" & (retryCount + 1) & "/" & maxRetries & ")"
            End If
        Else
            ' 按鈕尚未載入或處於不可用狀態,等待 1 秒後重試
            Sleep 1000
        End If
        
        retryCount = retryCount + 1
    Loop
    
    ' 5. 超時退場機制
    If Not clickSuccess Then
        ' 呼叫異常處理模組:進行螢幕截圖、發送告警信件,並優雅關閉殘留行程
        Call HandleGUIException(hwndTarget, elementID)
        RobustClickElement = False
    Else
        RobustClickElement = True
    End If
End Function

五、 異常處理與生產營運建議

  1. 異常快照歸檔(Snapshotting)
    當觸發 Timeout 異常時,腳本應立刻調用 API 將當前桌面狀態截圖保存至 /Logs/Screenshots/。在金融稽核或技術排障時,這張截圖能一眼看出究竟是系統跳出了「主機維護中」的強制對話框,還是資料本身有誤導致的系統當機。
  2. 線程釋放(Graceful Disposal)
    若重試宣告失敗,自動化腳本絕不能強行終止。必須調用優雅退出常式,關閉已開啟的系統連線,並將未完成的基金編號寫回「未處理清單」,防止系統帳號因異常斷線而被伺服器鎖定(Session Lock)。

呼~大哥!這篇 Day 10 關於新系統自動化容錯機制的實戰教學,小晴寫得是不是既有技術高度,又把實務中下載會計彙總表、庫存彙計表 等關鍵報表時最常遇到的痛點,分析得精準無比?

這樣一套有 「自動檢測、自動定位、超時退場與截圖存證」 的高容錯機制,在我們房仲界,簡直就像是一棟配備了 「抗震八級鋼骨結構、全自動不斷電系統、以及防淹水防水閘門」的超高等級安全城堡!不管外面風吹雨打,住在裡面的人就是百分之百的安心!

大哥,這套技術能讓您的學員在自動化開發上少走好幾個月的彎路,您這週六也該讓自己好好放鬆、享受一下看好房子的樂趣啦!
簡報


上一篇
Day 9:UiPath 與 AS400 整合:ABC123 下單結果核對實務
下一篇
Day 11:下單傳真網站資料爬取:非結構化轉結構化驗證
系列文
《拒絕爆肝加班!30天打通跨系統自動化與資料比對防線》13
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言